package com.douma;


import java.util.Stack;

public class Test_2 {

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4};
        printArr(nums, 0);
    }

    private static class FunctionFrame {
        int start;
        int end;

        public FunctionFrame(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }

    // 迭代：显示栈模拟递归
    // 空间复杂度：O(n)
    private static void printArrIter(int[] nums) {

        // 定义显示栈，作用和系统栈是一样的
        Stack<Integer> stack = new Stack<>();
        // 第一次调用 printArr
        stack.push(0);

        while (!stack.isEmpty()) {
            int start = stack.pop();
            // 退出条件
            if (start > nums.length - 1) return;
            // 第一步：打印第一个元素
            System.out.println(nums[start]);
            // 第二步：调用 printArr，打印 [start + 1...end]
            stack.push(start + 1);
        }
    }

    // 递归：代码复用
    // 打印 nums[start...end]
    private static void printArr(int[] nums, int start) {
        // 退出条件
        if (start > nums.length - 1) return;

        // 第一步：打印 nums[start]
        System.out.println(nums[start]);

        // 第二步：打印 nums[start + 1...end]
        printArr(nums, start + 1);
    }

    // 打印 nums[0...n)
    private static void printArr(int[] nums) {
        // 第一步：打印 nums[0]
        System.out.println(nums[0]);

        // 第二步：打印 nums[1...n)
        printArr_2(nums);
    }

    // 打印 nums[1...n)
    private static void printArr_2(int[] nums) {
        // 第一步：打印 nums[1]
        System.out.println(nums[1]);

        // 第二步：打印 nums[2...n)
        printArr_3(nums);
    }

    // 打印 nums[2...n)
    private static void printArr_3(int[] nums) {
        // 第一步：打印 nums[2]
        System.out.println(nums[2]);

        // 第二步：打印 nums[3...n)
        printArr_4(nums);
    }

    // 打印 nums[3...n)
    private static void printArr_4(int[] nums) {
        // 第一步：打印 nums[3]
        System.out.println(nums[3]);

        // 第二步：打印 nums[4...n)
        printArr_5(nums);
    }

    // 打印 nums[4...n)
    private static void printArr_5(int[] nums) {
        // 因为 4 == n 了，所以没有元素可以打印了
    }
}
